/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pl.tewi.controllers;

import javax.naming.InitialContext;
import javax.transaction.UserTransaction;
import pl.tewi.exceptions.GeneralFrameworkException;

/**
 * Interfejs kontrolera sterującego serwerem aplikacyjnym. Aby dodać obsługę innego
 * serwera aplikacyjnego należy stworzyć klasę implementującą ten interfejs.
 * Obsługa typu serwera aplikacyjnego znajduje się w procesorze adnotacji, typie
 * serwra apikacyjnego i fabryce kontrolerów
 * @author Marcin Kwapisz
 */
public interface ServerController {

    /**
     * Uruchom serwera aplikacyjny w trybie wbudowanym
     * @throws błąd uruchaimiania serwera aplikacyjnego
     */
    public void startEmbeddedServer() throws GeneralFrameworkException;

    /**
     * Zatrzymaj serwer uruchomiony w trybie wbudowanym
     * @throws błąd zatrzymywania serwera aplikacyjnego
     */
    public void stopEmbeddedServer() throws GeneralFrameworkException;

    /**
     * Zainstaluj aplikację na serwerze
     * @throws błąd instalacji aplikacji na serwerze aplikacyjnym
     */
    public void deployApplication() throws GeneralFrameworkException;

    /**
     * skonfuruj zasoby konieczne do uruchomienia aplikacji, np. poprzez
     * wdrożenie pliku zasobów na serwer
     * @throws błąd wdrażania zasobów na serwera aplikacyjny
     */
    public void deployApplicationResources() throws GeneralFrameworkException;

    /**
     * Skonfiguruj zasady bezpieczeństwa na serwerze apliakcyjnym, np poprzez 
     * wdrożenie pliku opisującego użytkowników, grupy i realm-y bezpieczeństwa
     * @throws błąd konfigurowania ustawień bezpieczeństwa
     */
    public void configureSecuritySettings() throws GeneralFrameworkException;

    /**
     * Pobiera transakcję użytkownika
     * @return transakcja użytkownika
     * @throws GeneralFrameworkException błąd pobierania transakcji użytkownika
     */
    public UserTransaction getCurrentTransaction() throws GeneralFrameworkException;

    /**
     * Wstrzykuje zasoby takie jak komponenty EJB, ManageBeans i różnego rodzaju zasoby pobrane z jndi.</p>
     * Metoda może zostać wykorzstana do uwierzytelnienia użytkownika w systemie 
     * poprzez ustawienie parametrów InitialContext
     * @param test obiekt testu junit
     * @param runAsUser uruchom metody komponentów jako użytkownik.
     * @throws GeneralFrameworkException błąd wstrzykiwania
     */
    public void injectResources(Object test, String runAsUser) throws GeneralFrameworkException;

    /**
     * Uwierzytelnienie użytkownika. Implementacja metody może być pusta,
     * jeżeli użytkownik jest uwierzytelniany przez {@link InitialContext}.
     * Wtedy należy wykorzystać metodę {@link ServerController#injectResources(java.lang.Object, java.lang.String) }
     * @param user nazwa użytkownika 
     * @param password hasło użtykonika
     * @throws GeneralFrameworkException błąd uwierzytelnienia
     */
    public void login(String user, String password) throws GeneralFrameworkException;

    /**
     * Wylogowanie użytkownika. Motoda może być pusta jeżeli uwierzytelnienie 
     * następiło przez parametry {@link InitialContext}
     * @throws GeneralFrameworkException błąd wylogowania użytkownika
     */
    public void logout() throws GeneralFrameworkException;
}
